package Buscaminas.Principal;
import java.util.Random;


public class Modelo {

	/**
	 * VARIABLES DE INSTANCIA
	 */
	//Variables tama�o y minas
	private int alto, ancho, minas;
	
	// Matrices del tama�o del tablero
	private boolean [][]bombas;// localizacion de las bombas(true=bomba, false=no bomba)
	private boolean [][]pulsado;// casillas pulsadas (si una casilla esta pulsada, no se puede volver a pulsar(true=pulsada, false=no pulsada)) 
	private boolean [][]banderas;// indica si hay una bandera. Si hay bandera, no podemos pulsar(destapar) esa casilla(lo controlo en el controlador, al pulsar una tecla pregunto si hay bandera)
	
	/**
	 * CONSTRUCTOR
	 */
	public Modelo(int alto, int ancho, int minas){
		this.alto = alto;
		this.ancho = ancho;
		this.minas = minas;
		
		//rellenar con X bombas (10 por defecto)
		bombas = new boolean [alto][ancho];
		rellenar(this.minas);
		
		// Inicializar pulsado a falso
		pulsado = new boolean [alto][ancho];
		inicializarFalse(this.pulsado);
		
		// Inicializar banderas a falso
		banderas = new boolean [alto][ancho];
		inicializarFalse(this.banderas);
	}
	
	/**
	 * M�todo que inicializa una M�triz a false
	 */
	private void inicializarFalse(boolean [][]matriz){
		for(int i=0; i<alto; i++)
			for(int k=0; k<ancho; k++)
				matriz[i][k]=false;
	}
	
	/**
	 * Rellenar con X bombas aleatorias
	 */
	private void rellenar(int minas){
		//1� lo pongo todo a false
		inicializarFalse(bombas);
		
		//Variables necesarias
		Random r = new Random();
		int cont=0;
		
		//poner 10 bombas
		while(cont<minas){
			int x = r.nextInt(alto);
			int y = r.nextInt(ancho);
			if(!bombas[x][y]){// Si no hay una bomba...
				bombas[x][y] = true;//...la pone...
				cont++;//...y incrementa el contador
			}
		}
	}
	//******************************************************************************************//
	
	
	/**
	 * Pulsar una casilla (devuelve el n� de bombas lindantes)
	 * @param i
	 * @param k
	 * @return 0..8 = n�bombas lindantes, 999 = bomba, -1 = ya estaba pulsado
	 */
	public int pulsar(int i, int k){
		int num = -1;
		
		if(!pulsado[i][k]){// si no se a pulsado antes...
		
			//contar el n� de bombas que lindan con la casilla pulsada
			if(bombas[i][k]){// si hay una bomba
				num = 999;// 999 = bomba
			}
			else{
				num = contar(i,k);
			}
			
			//Indico que se ha pulsado
			pulsado[i][k] = true;
		}
		return num;
		
	}
	
	/**
	 * Cuenta el n� de bombas alrededor de una casilla dada
	 * @param i
	 * @param k
	 * @return (n� de bombas lindantes)
	 */
	private byte contar(int i, int k){
		
		byte total = 0;
		
		/**
		 * Para no desbordar el array hay que controlar los �ndices donde buscamos bombas para cada tipo de casilla 
		 */
		
		//	�_|
		if(i == 0 && k == 0){// casilla superior izquierda
			if(bombas[i][k+1]) total++;
			
			if(bombas[i+1][k]) total++;
			if(bombas[i+1][k+1]) total++;
		}
			 
		//	|_�
		if(i == 0 && k == ancho-1){// casilla superior derecha			
			if(bombas[i][k-1]) total++;
			
			if(bombas[i+1][k-1]) total++;
			if(bombas[i+1][k]) total++;
		}
		
		/*	_
		 	�|		 				*/
		if(i == alto-1 && k == 0){// casilla inferior izquierda
			if(bombas[i-1][k]) total++;
			if(bombas[i-1][k+1]) total++;
			
			if(bombas[i][k+1]) total++;
		}
		
		/*	 _
	 		|�		 				*/
		if(i == alto-1 && k == ancho-1){// casilla inferior derecha
			if(bombas[i-1][k-1]) total++;
			if(bombas[i-1][k]) total++;
			
			if(bombas[i][k-1]) total++;
		}
		
		// _|____�____|_
		if(i == 0 && k != 0 && k != ancho-1){// arriba (menos las 2 esquinas)		
			if(bombas[i][k-1]) total++;
			if(bombas[i][k+1]) total++;
			
			if(bombas[i+1][k-1]) total++;
			if(bombas[i+1][k]) total++;
			if(bombas[i+1][k+1]) total++;
		}
		
		// ______________
		//  |    �     |
		if(i == alto-1 && k != 0 && k != ancho-1){// abajo (menos las 2 esquinas)
			if(bombas[i-1][k-1]) total++;
			if(bombas[i-1][k]) total++;
			if(bombas[i-1][k+1]) total++;
			
			if(bombas[i][k-1]) total++;
			if(bombas[i][k+1]) total++;
		}
		/*		_|
				 |
				�|
				_|
				 |			*/
		if(k == 0 && i != 0 && i != alto-1){// iquierda (menos las 2 esquinas)
			if(bombas[i-1][k]) total++;
			if(bombas[i-1][k+1]) total++;
			
			if(bombas[i][k+1]) total++;
			
			if(bombas[i+1][k]) total++;
			if(bombas[i+1][k+1]) total++;
		}
		
		/*
				|_
				|
				|�
				|_
				|
		 */
		if(k == ancho-1 && i != 0 && i != alto-1){// derecha (menos las 2 esquinas)
			if(bombas[i-1][k-1]) total++;
			if(bombas[i-1][k]) total++;
			
			if(bombas[i][k-1]) total++;
			
			if(bombas[i+1][k-1]) total++;
			if(bombas[i+1][k]) total++;
		}
		
		/*		_|______|_
		 		 |		|
		 		 |	�	|
		 		_|______|_
		 		 |		|	 */
		if(k != 0 && k != ancho-1 && i != 0 && i != alto-1){// casillas del centro (menos las de los bordes)
			if(bombas[i-1][k-1]) total++;
			if(bombas[i-1][k]) total++;
			if(bombas[i-1][k+1]) total++;
			
			if(bombas[i][k-1]) total++;
			if(bombas[i][k+1]) total++;
			
			if(bombas[i+1][k-1]) total++;
			if(bombas[i+1][k]) total++;
			if(bombas[i+1][k+1]) total++;
		}
		
		return total;
	}

	
	/**
	 * �He ganado? (true = ganado, false = no ganado)
	 */
	public boolean heGanado(){
		boolean ganado = true;
		
		for(int i=0; i<alto; i++)
			for(int k=0; k<ancho; k++)
				if(bombas[i][k] == pulsado[i][k])// tienen que ser siempre distintos para ganar (las casillas pulsadas no son bombas)
					ganado = false;
		return ganado;
	}

	
	/**
	 * GET
	 */
	public int getAlto() {return alto;}
	public int getAncho() {return ancho;}
	public int getMinas() {return minas;}
	public boolean[][] getBombas() {return bombas;}
	public boolean[][] getPulsado() {return pulsado;}
	public boolean[][] getBanderas() {return banderas;}


	
}
